//
// Created by 游钐栗 on 2022/10/7.
//

#ifndef MEDIATOOLS_EXTRACTVIDEOWND_H
#define MEDIATOOLS_EXTRACTVIDEOWND_H

#include <QWidget>
#include <cstdio>
#include <cstdlib>
#include <cstring>

extern "C"{
#include <libavutil/log.h>
#include <libavformat/avio.h>
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/frame.h>
#include <libavutil/mem.h>
}

#define VIDEO_INBUF_SIZE (1*1024*1024)
#define VIDEO_REFILL_THRESH 4096


QT_BEGIN_NAMESPACE
namespace Ui { class ExtractVideoWnd; }
QT_END_NAMESPACE

class ExtractVideoWnd : public QWidget {
Q_OBJECT

public:
    explicit ExtractVideoWnd(QWidget *parent = nullptr);
    ~ExtractVideoWnd() override;

    /**
     * H264、H265格式转yuv解码函数
     * @param dec_ctx
     * @param pkt
     * @param frame
     * @param outfile
     */
    static void decode_video(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame,
                             FILE *outfile);
private slots:
    /**
     * 解析出h264文件按钮
     */
    void h264_Buttonclicked();

    /**
     * 解析出yuv文件按钮
     */
     void yuv_Buttonclicked();

private:
    Ui::ExtractVideoWnd *ui;

    /**
     * 用户自定义的信号槽
     */
    void custom_signalslot();

    /**
     * 将视频容器中的视频流提取出H264文件
     * @param q_filename
     * @return
     */
    int get_h264(QString q_filename);

    /**
     * 将视频文件(H264、H265等)进一步解码成未压缩的yuv文件
     * @param q_filename
     * @return
     */
    int get_yuv(QString q_filename);
};

#endif
